using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using AppManagement.UsersManager;
	using System.Data;
	using System.Drawing;
	using System.IO;
    using AppManagement.Reports;
	#endregion

	public partial class FrmChiTietPHIEUNHAPKHO : Office2007Form
	{
		public EventHandler Handler { get; set; }
		private DataTable DataSource;
		private int PHIEU_NHAP_KHO_ID;
        private int PHIEU_DAT_HANG_ID;

		public FrmChiTietPHIEUNHAPKHO(int phieu_dat_hang_id, int phieu_nhap_kho_id = -1)
		{
			InitializeComponent();
			PHIEU_NHAP_KHO_ID = phieu_nhap_kho_id;
            PHIEU_DAT_HANG_ID = phieu_dat_hang_id;
		}

		private void FrmChiTietPHIEUNHAPKHO_Load(object sender, EventArgs e)
		{
			InitGridView();
			InitDataSource();
            LoadPhieuDatHang();
            if (PHIEU_NHAP_KHO_ID != -1)
            {
                LoadPHIEUNHAPKHO();
            }
		}

        public void LoadPhieuDatHang()
        {
            var phieudathang = PHIEUDATHANGRepository.SelectByID(PHIEU_DAT_HANG_ID);
            txtPHIEUDATHANG_ID.Text = phieudathang.PHIEUDATHANG_ID.ToString();
            txtNhaCungCap.Text = phieudathang.NHACUNGCAP.TEN_NCC;
            txtNgayDatHang.Text = String.Format("{0:dd/MM/yyyy}", phieudathang.NGAY_DAT_HANG);
            txtNgayNhapKho.Text = String.Format("{0:dd/MM/yyyy}", DateTime.Now);
        }

		private void InitGridView()
		{
			DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "ID Thiết bị",
				DataPropertyName = "THIET_BI_ID",
				Name = "THIET_BI_ID",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/3))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Tên thiết bị",
				DataPropertyName = "TEN_THIET_BI",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/3))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Số lượng nhập",
				DataPropertyName = "SO_LUONG",
				Name = "SO_LUONG",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/3)) - 1
			};
			dtgvData.Columns.Add(objColumn);
		}

		public void InitDataSource()
		{
			DataSource = new DataTable();
			DataSource.Columns.Add("THIET_BI_ID");
			DataSource.Columns.Add("TEN_THIET_BI");
			DataSource.Columns.Add("SO_LUONG");
			DataView objTimeSheetDV = new System.Data.DataView(DataSource);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

		private void btnThem_Click(object sender, EventArgs e)
		{
			FrmCapNhatCHITIETPHIEUNHAPKHO frm = new FrmCapNhatCHITIETPHIEUNHAPKHO();
			frm.Handler += GetCHITIETPHIEUNHAPKHO;
			frm.ShowDialog();
		}

		public void GetCHITIETPHIEUNHAPKHO(object sender, EventArgs e)
		{
			var eventType = (TransferSimpleDataEvent)e;
			string[] comp = eventType.Data.Split(new char[] { '#' });
			var item = THIETBIRepository.SelectByID(int.Parse(comp[0]));
			if(item != null)
			{
				DataSource.Rows.Add(item.THIET_BI_ID, item.TEN_THIET_BI, comp[1]);
			}
		}


		private void btnXoa_Click(object sender, EventArgs e)
		{
			if (DataSource.Rows.Count > 0)
			{
				DataSource.Rows.RemoveAt(dtgvData.SelectedRows[0].Index);
			}
		}

		private bool ValidateInput(ref string errorText)
		{
			if (DataSource.Rows.Count == 0)
			{
				errorText = "Danh sách hiện thời không có gì!";
				return false;
			}

            var lstThietBiDatHang = CHITIETPHIEUDATHANGRepository.SelectByPHIEUDATHANG_ID(PHIEU_DAT_HANG_ID);
            for (int i = 0; i < DataSource.Rows.Count; i++)
            {
                var exist = false;
                foreach (var item in lstThietBiDatHang)
                {
                    // Kiem tra thiet bi trong phieu nhap khong co trong phieu dat hang
                    if (item.THIET_BI_ID.Value.ToString() == DataSource.Rows[i]["THIET_BI_ID"].ToString())
                    {
                        exist = true;
                        break;
                    }
                }
                if (!exist)
                {
                    errorText = "Thiết bị " + DataSource.Rows[i]["TEN_THIET_BI"].ToString() + " trong phiếu nhập không có trong phiếu đặt hàng!";
                    return false;
                }
                else
                {
                    var thietbiDatHang = lstThietBiDatHang.FirstOrDefault(n => n.THIET_BI_ID == int.Parse(DataSource.Rows[i]["THIET_BI_ID"].ToString()));
                    // So luong thiet bi trong phieu nhap > so luong thiet bi trong phieu dat hang
                    if (int.Parse(DataSource.Rows[i]["SO_LUONG"].ToString()) + thietbiDatHang.DA_NHAP.Value > thietbiDatHang.SO_LUONG_DH.Value)
                    {
                        errorText = "Số lượng thiết bị " + DataSource.Rows[i]["TEN_THIET_BI"].ToString() + " trong phiếu nhập > trong phiếu đặt hàng!";
                        return false;
                    }
                }
            }

			return true;
		}

		private void btnCapNhat_Click(object sender, EventArgs e)
		{
			var errorText = "";
			bool success = false;
			if (!ValidateInput(ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionUpdate())
			{
				success = true;
			}
			if (success)
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
			}
			else
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnThoat_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		private bool ActionUpdate()
		{
			try
			{
				DataContext.Instance.Connection.Open();
				using (var transaction = DataContext.Instance.Connection.BeginTransaction())
				{
					var phieunhapkho = new PHIEUNHAPKHO
					{
						PHIEUDATHANG_ID = int.Parse(txtPHIEUDATHANG_ID.Text),
						NHAN_VIEN_ID = GlobalVariables.g_CurrentUser.NGUOIDUNG_ID,
						NGAY_NHAP_KHO = DateTime.Now,
					};
					if (PHIEUNHAPKHORepository.Insert(phieunhapkho))
					{
                        GlobalVariables.Logger.Info("Insert phieu nhap kho: true");
						for (int i = 0; i <= DataSource.Rows.Count - 1; i++)
						{
                            var soluong = int.Parse(DataSource.Rows[i]["SO_LUONG"].ToString());
                            var idthietbi = int.Parse(DataSource.Rows[i]["THIET_BI_ID"].ToString());
							var chitietphieunhapkho = new CHITIETPHIEUNHAPKHO
							{
								PHIEU_NHAP_KHO_ID = phieunhapkho.PHIEU_NHAP_KHO_ID,
                                THIET_BI_ID = idthietbi,
                                SO_LUONG = soluong,
							};
							if (!CHITIETPHIEUNHAPKHORepository.Insert(chitietphieunhapkho))
							{
                                GlobalVariables.Logger.Info("Insert chi tiet phieu nhap kho: false");
								DataContext.Instance.Connection.Close();
								return false;
							}
                            GlobalVariables.Logger.Info("Insert chi tiet phieu nhap kho: true");
                            var thietBiDatHang = CHITIETPHIEUDATHANGRepository.SelectByPHIEUDATHANG_ID(PHIEU_DAT_HANG_ID).FirstOrDefault(n => n.THIET_BI_ID == idthietbi);
                            thietBiDatHang.DA_NHAP += soluong;
                            var result = CHITIETPHIEUDATHANGRepository.Save();
                            GlobalVariables.Logger.Info("Update so luong thiet bi da nhap: " + result);

                            // Cap nhat so luong ton
                            var thietbi = THIETBIRepository.SelectByID(chitietphieunhapkho.THIET_BI_ID.Value);
                            thietbi.SL_TON += chitietphieunhapkho.SO_LUONG.Value;
                            result = THIETBIRepository.Save();
                            GlobalVariables.Logger.Info("Update so luong thiet bi ton trong kho: " + result);
						}
						transaction.Commit();
					}
					else
					{
                        GlobalVariables.Logger.Info("Insert phieu nhap kho: false");
						DataContext.Instance.Connection.Close();
						return false;
					}
				}
				DataContext.Instance.Connection.Close();
				return true;
			}
			catch
			{
				DataContext.Instance.Connection.Close();
				return false;
			}
		}

        private void LoadPHIEUNHAPKHO()
        {
            var phieunhapkho = PHIEUNHAPKHORepository.SelectByID(PHIEU_NHAP_KHO_ID);
            if (phieunhapkho != null)
            {
                txtPHIEU_NHAP_KHO_ID.Text = PHIEU_NHAP_KHO_ID.ToString();
                LoadCHITIETPHIEUNHAPKHO(phieunhapkho);
            }
        }

		private void LoadCHITIETPHIEUNHAPKHO(PHIEUNHAPKHO phieunhapkho)
		{
			var lst = CHITIETPHIEUNHAPKHORepository.SelectByPHIEU_NHAP_KHO_ID(phieunhapkho.PHIEU_NHAP_KHO_ID);
			if (lst.Count > 0)
			{
				foreach (var item in lst)
				{
					DataSource.Rows.Add(item.THIET_BI_ID, item.THIETBI.TEN_THIET_BI, item.SO_LUONG);
				}
			}
		}

        private void btnInPhieu_Click(object sender, EventArgs e)
        {
            var phieunhaphang = PHIEUNHAPKHORepository.SelectByID(PHIEU_NHAP_KHO_ID);
            FrmInPhieuNhapKho frm = new FrmInPhieuNhapKho
            {
                NgayNhapKho = phieunhaphang.NGAY_NHAP_KHO.Value,
                NhaCungCap = phieunhaphang.PHIEUDATHANG.NHACUNGCAP.TEN_NCC,
                IDPhieuNhapKho = phieunhaphang.PHIEU_NHAP_KHO_ID
            };
            frm.ShowDialog();
        }
	}
}
